﻿using log4net;
using PcaCaja.BOL;
using PcaCore.DAL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace PcaCaja.DAL
{
    public class dLiquidacion
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(dLiquidacion));

        #region public

        public static long Insert(string empresaId,
                                  string oficinaId,
                                  string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_add_liquidacion(varchar,--empresa_id $1
                //               varchar,--oficina_id $2
                //               character --usuario_id $3
                //               )RETURNS bigint
                object id = Core.ExecuteScalar("pca_caja.fn_add_liquidacion",
                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId));

                return Convert.ToInt64(id); 
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static oLiquidacion Get(string empresaId,
                                       string oficinaId,
                                       long liquidacionId,
                                       string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_liquidacion(varchar,--empresa_id $1
                //               varchar,--oficina_id $2
                //               bigint,--liquidacion_id $3
                //               varchar --usuario_id $4
                //               )RETURNS SETOF pca_caja.liquidaciones
                return Core.GetObjectDb<oLiquidacion>("pca_caja.fn_get_liquidacion",
                                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, liquidacionId),
                                                      new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oLiquidacion> GetListActivo(string empresaId,
                                                       string oficinaId,
                                                       string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_liquidaciones_activa(varchar,--empresa_id $1
                //                     varchar,--oficina_id $2
                //                     varchar --usuario_id $3
                //                     )RETURNS SETOF pca_caja.liquidaciones
                return Core.GetListObjecstDb<oLiquidacion>("pca_caja.fn_get_list_liquidaciones_activa",
                                                           new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                           new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                           new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwLiquidacion> GetList(int start,
                                                   int limit,
                                                   out int totalRecords,
                                                   string empresaId,
                                                   string oficinaId,
                                                   string usuarioId,
                                                   bool cerrado)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_liquidaciones(integer,--start $1
                //                  integer,--limit $2
                //                  varchar,--empresa_id $3
                //                  varchar,--oficina_id $4
                //                  varchar,--usuario_id $5
                //                  boolean --cerrado $6
                //                  )RETURNS SETOF pca_caja.vw_liquidaciones
                return Core.GetListObjecstDb<oVwLiquidacion>("pca_caja.fn_get_list_liquidaciones",
                                                             out totalRecords,
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Boolean, cerrado));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static List<oVwLiquidacion> GetList(int start,
                                                   int limit,
                                                   out int totalRecords,
                                                   string empresaId,
                                                   string oficinaId,
                                                   string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_get_list_liquidaciones(integer,--start $1
                //                  integer,--limit $2
                //                  varchar,--empresa_id $3
                //                  varchar,--oficina_id $4
                //                  varchar --usuario_id $5
                //                  )RETURNS SETOF pca_caja.vw_liquidaciones
                return Core.GetListObjecstDb<oVwLiquidacion>("pca_caja.fn_get_list_liquidaciones",
                                                             out totalRecords,
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, start),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Integer, limit),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                                             new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        public static void Cerrar(string empresaId,
                                  string oficinaId,
                                  long liquidacionId,
                                  string usuarioId)
        {
            try
            {
                //CREATE OR REPLACE FUNCTION pca_caja.fn_cerrar_liquidacion(varchar,--empresa_id $1
                //              varchar,--oficina_id $2
                //              bigint,--liquidacion_id $3
                //              character --usuario_id $4
                //              )RETURNS void
                Core.ExecuteNonQuery("pca_caja.fn_cerrar_liquidacion",
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, empresaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, oficinaId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Bigint, liquidacionId),
                                     new oParametro(NpgsqlTypes.NpgsqlDbType.Varchar, usuarioId));
            }
            catch (Exception ex)
            {
                throw Core.LogException(log, ex, MethodBase.GetCurrentMethod().Name);
            }
        }

        #endregion
    }
}
